package service

import (
	"bloggo/structs"
	"context"
	"errors"
	"fmt"
	"gitee.com/chunanyong/logger"
	"gitee.com/chunanyong/zorm"
)

//SaveTbPhotoStruct 保存 照片
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func SaveTbPhotoStruct(ctx context.Context, tbphotostruct *structs.TbPhotoStruct) error {

	// tbphotostruct对象指针不能为空
	if tbphotostruct == nil {
		return errors.New("tbphotostruct对象指针不能为空")
	}
	//匿名函数return的error如果不为nil,事务就会回滚
	_, errSaveTbPhotoStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始

		_, errSaveTbPhotoStruct := zorm.Insert(ctx, tbphotostruct)

		if errSaveTbPhotoStruct != nil {
			return nil, errSaveTbPhotoStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errSaveTbPhotoStruct != nil {
		errSaveTbPhotoStruct := fmt.Errorf("service.SaveTbPhotoStruct错误:%w", errSaveTbPhotoStruct)
		logger.Error(errSaveTbPhotoStruct)
		return errSaveTbPhotoStruct
	}

	return nil
}

//UpdateTbPhotoStruct 更新照片
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateTbPhotoStruct(ctx context.Context, tbphotostruct *structs.TbPhotoStruct) error {

	// tbphotostruct对象指针或主键Id不能为空
	if tbphotostruct == nil || (tbphotostruct.Id) < 1 {
		return errors.New("tbphotostruct对象指针或主键Id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateTbPhotoStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, errUpdateTbPhotoStruct := zorm.Update(ctx, tbphotostruct)

		if errUpdateTbPhotoStruct != nil {
			return nil, errUpdateTbPhotoStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateTbPhotoStruct != nil {
		errUpdateTbPhotoStruct := fmt.Errorf("service.UpdateTbPhotoStruct错误:%w", errUpdateTbPhotoStruct)
		logger.Error(errUpdateTbPhotoStruct)
		return errUpdateTbPhotoStruct
	}

	return nil
}

//UpdateNotZeroTbPhotoStruct 更新照片
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateNotZeroTbPhotoStruct(ctx context.Context, tbphotostruct *structs.TbPhotoStruct) error {

	// tbphotostruct对象指针或主键Id不能为空
	if tbphotostruct == nil || (tbphotostruct.Id) < 1 {
		return errors.New("tbphotostruct对象指针或主键Id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateTbPhotoStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, errUpdateTbPhotoStruct := zorm.UpdateNotZeroValue(ctx, tbphotostruct)

		if errUpdateTbPhotoStruct != nil {
			return nil, errUpdateTbPhotoStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateTbPhotoStruct != nil {
		errUpdateTbPhotoStruct := fmt.Errorf("service.UpdateNotZeroTbPhotoStruct错误:%w", errUpdateTbPhotoStruct)
		logger.Error(errUpdateTbPhotoStruct)
		return errUpdateTbPhotoStruct
	}

	return nil
}

//DeleteTbPhotoStructById 根据Id删除照片
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func DeleteTbPhotoStructById(ctx context.Context, id string) error {

	//id不能为空
	if len(id) < 1 {
		return errors.New("id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errDeleteTbPhotoStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		finder := zorm.NewDeleteFinder(structs.TbPhotoStructTableName).Append(" WHERE id=?", id)
		_, errDeleteTbPhotoStruct := zorm.UpdateFinder(ctx, finder)

		if errDeleteTbPhotoStruct != nil {
			return nil, errDeleteTbPhotoStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errDeleteTbPhotoStruct != nil {
		errDeleteTbPhotoStruct := fmt.Errorf("service.DeleteTbPhotoStruct错误:%w", errDeleteTbPhotoStruct)
		logger.Error(errDeleteTbPhotoStruct)
		return errDeleteTbPhotoStruct
	}

	return nil
}

//FindTbPhotoStructById 根据Id查询照片信息
//ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindTbPhotoStructById(ctx context.Context, id string) (*structs.TbPhotoStruct, error) {
	//id不能为空
	if len(id) < 1 {
		return nil, errors.New("id不能为空")
	}

	//根据Id查询
	finder := zorm.NewSelectFinder(structs.TbPhotoStructTableName).Append(" WHERE id=?", id)
	tbphotostruct := structs.TbPhotoStruct{}
	has, errFindTbPhotoStructById := zorm.QueryRow(ctx, finder, &tbphotostruct)

	//记录错误
	if errFindTbPhotoStructById != nil {
		errFindTbPhotoStructById := fmt.Errorf("service.FindTbPhotoStructById错误:%w", errFindTbPhotoStructById)
		logger.Error(errFindTbPhotoStructById)
		return nil, errFindTbPhotoStructById
	}

	if !has {
		return nil, nil
	}

	return &tbphotostruct, nil

}

//FindTbPhotoStructList 根据Finder查询照片列表
//ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindTbPhotoStructList(ctx context.Context, finder *zorm.Finder, page *zorm.Page) ([]structs.TbPhotoStruct, error) {

	//finder不能为空
	if finder == nil {
		return nil, errors.New("finder不能为空")
	}

	tbphotostructList := make([]structs.TbPhotoStruct, 0)
	errFindTbPhotoStructList := zorm.Query(ctx, finder, &tbphotostructList, page)

	//记录错误
	if errFindTbPhotoStructList != nil {
		errFindTbPhotoStructList := fmt.Errorf("service.FindTbPhotoStructList错误:%w", errFindTbPhotoStructList)
		logger.Error(errFindTbPhotoStructList)
		return nil, errFindTbPhotoStructList
	}

	return tbphotostructList, nil
}
